package com.Multithreading.Synchronization;

import com.Multithreading.Asynchronization.Bank;

import java.util.concurrent.locks.ReentrantLock;

public class LockableBank extends Bank {
    // 采用锁对象的方法实现资源的互斥访问

    // 1. 需要被互斥访问的对象，其类需要包含一个用于实现锁的ReentrantLock类实例
    protected final ReentrantLock bankLock = new ReentrantLock();

    public LockableBank(int n, double initialBalance) {
        super(n, initialBalance);
    }

    // 2.类似于PV原语操作，对于需要进行互斥的操作一定要在进行前获得锁，结束后归还锁
    //重载transform方法
    @Override
    public void transform(int from, int to, double money) throws InterruptedException{
        this.bankLock.lock();// 互斥操作前获得锁
        try{
            super.transform(from, to, money);
        }finally {
            this.bankLock.unlock();//结束后释放锁
        }
    }
}
